iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
1

Laraval Authentication (1)-> 自行token可以參考先前的「Eloquent ORM 實作(2):以登入為例」這篇。

Passport也在官方文件中,也是一種 OAuth委任授權技術機制。

使用好處如下:

  • 可快速設定、統一管理token資料讓user進行相關操作(有個 oauth_access_tokens table)。
  • 前後端分離:透過使用OAUTH2,user可授予權限、使用token讓外部網頁執行自己網站的action 。

.
.
.

作法如下

初始安裝

先到專案資料夾上安裝 composer require laravel/passport

先migrate再安裝passport

因為passport透過composer安裝後會有許多新的table,先php artisan migrate後會發現以下資料表建立成功。

https://ithelp.ithome.com.tw/upload/images/20201007/20125263jAZK0E7ymy.png

再執行 php artisan passport:install
https://ithelp.ithome.com.tw/upload/images/20201007/201252635ySm8GZx2z.png

調整 user model

加入使用passport必要設定

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

設定 AuthServiceProvider

  • 加入 use Laravel\Passport\Passport;
  • 設定passport路由與有效時間
    public function boot()
    {
          $this->registerPolicies();
          //路由
          Passport::routes();
          //有效時間
          Passport::personalAccessTokensExpireIn(now()->addMinutes(1));
    
    }
    

調整 auth.php 設定檔

因為主要是用在api溝通上,所以僅修改api的部分。

api' => [
            // 'driver' => 'token',-> 原作法
            'driver' => 'passport',
            'provider' => 'users',
            'hash' => false,
        ],

設定router/middleware

因為把passport機制修改到config/auth.php裡頭,所以要決定哪個api要使用passport時,router需設定如下,才能使用passport:

Auth::routes();

Route::middleware('auth:api')->group(function() {
    Route::get('user/{userId}/detail', 'Auth\LoginController@show');
});

controller

登入

作法
原本的很類似,但在token部分改用passport的方法。

$credentials = $request->only('name', 'password');

if (Auth::guard()->attempt($credentials)) {
    $user = Auth::user();
    $token = $user->createToken($user->name . '-' . now());
    return response()->json(['token' => $token->accessToken]);
} else {
    return response()->json(['error01' => 'invalid name or password'], 401);
}

成果
https://ithelp.ithome.com.tw/upload/images/20201007/20125263IAfqxsfTjv.png

透過token取得user 資料

方法

public function show(Request $request, $userId)
{
   if (Auth::user()->id == $userId) {
       return response()->json(['message' => Auth::user()], 200);
   }else{
       return response()->json(['message' => 'User id error'], 404);
   }
}

成果

  1. 可以將 passport產生的token放在Auth,就可取得user資料
    https://ithelp.ithome.com.tw/upload/images/20201007/201252632XhkhKz7Lp.png

  2. 或把token放在header
    https://ithelp.ithome.com.tw/upload/images/20201007/20125263NBLs2HDUu5.png

沒有提供正確token會跳出

{ "message": "Unauthenticated." }


參考資料
https://laravel.com/docs/7.x/passport#introduction
https://learnku.com/docs/laravel/7.x/passport/9420
https://webomnizz.com/rest-api-and-passport-authentication-with-laravel/
https://stackoverflow.com/questions/59559949/in-which-cases-using-of-laravel-passport-gives-some-advantage


上一篇
File Storage:圖片上傳功能
下一篇
GCP PaaS : App Engine
系列文
30天開發與部署 Laravel 專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言